#include"Queue.h"

// 链式结构：表示队列     
//typedef struct QListNode     
//{     
//  struct QListNode* _next;     
//  QDataType _data;     
//}QNode;     
     
// 队列的结构     
//typedef struct Queue     
///{     
//  QNode* _front;     
//  QNode* _rear;     
//}Queue;     
 
QNode * BuyQueueNode(QDataType x)
{
  QNode * cur = (QNode*)malloc(sizeof(QNode));
  cur->_data = x;
  cur->_next = NULL;
  return cur;
}
// 初始化队列     
void QueueInit(Queue* q)
{
  q->_front = NULL;
  q->_rear = NULL;
}
// 队尾入队列     
void QueuePush(Queue* q, QDataType data)
{
  QNode * cur = BuyQueueNode(data);
  if(q->_front==NULL)
  {
      q->_front = q->_rear = cur;
  }
  else//有节点就在队列最后尾插，让rear后移一位 
  {
    q->_rear->_next = cur;
    q->_rear = cur;
  }
}
// 队头出队列     
void QueuePop(Queue* q)
{
    assert(q);//出队列就相当于链表的头删一样
    if(q->_front == NULL)
      return ;
    QNode *cur = q->_front->_next;
    free(q->_front);
    q->_front = cur;
}
// 获取队列头部元素     
QDataType QueueFront(Queue* q)
{
  return q->_front->_data;
}
// 获取队列队尾元素     
QDataType QueueBack(Queue* q)
{
  return q->_rear->_data;
}
// 获取队列中有效元素个数     
int QueueSize(Queue* q)
{
  QNode*cur;
  int cnt = 0;
  for(cur = q->_front;cur;cur = cur->_next)
  {
    cnt++;
  }
  return cnt;
}
// 检测队列是否为空，如果为空返回非零结果，如果非空返回0     
int QueueEmpty(Queue* q)
{
  if(q->_front == NULL)
    return 1;
  else return 0;
}
// 销毁队列     
void QueueDestroy(Queue* q)
{
  if(q->_front == NULL)
    return ;
  while(q->_front)
  {
    QueuePop(q);
  }
}
